package main

import (
	"fmt"
	"math/rand"
	"sort"
)

func main() {
	// s1 := make([]int, 3, 4)
	// s2 := append(s1, 1)
	// fmt.Printf("s1: %T,%[1]v,%d,%d,%p\n", s1, len(s1), cap(s1), &s1)
	// fmt.Printf("s2: %T,%[1]v,%d,%d,%p\n", s2, len(s2), cap(s2), &s2)
	// fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
	// // 修改s1的值
	// s1 = []int{0, 0, 1}
	// fmt.Printf("s1: %T,%[1]v,%d,%d,%p\n", s1, len(s1), cap(s1), &s1)
	// fmt.Printf("s2: %T,%[1]v,%d,%d,%p\n", s2, len(s2), cap(s2), &s2)
	// fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
	// // 修改s2的值
	// s2 = []int{0, 0, 2, 1}
	// fmt.Printf("s1: %T,%[1]v,%d,%d,%p\n", s1, len(s1), cap(s1), &s1)
	// fmt.Printf("s2: %T,%[1]v,%d,%d,%p\n", s2, len(s2), cap(s2), &s2)
	// s2 = append(s2, 3)
	// fmt.Printf("s2: %T,%[1]v,%d,%d,%p\n", s2, len(s2), cap(s2), &s2)

	// 2 生成新切片求和
	s1 := make([]int, 0, 8)
	test := [...]int{1, 4, 9, 16, 2, 5, 10, 15}
	for i := 0; i < len(test)-1; i++ {
		// fmt.Println(test[i] + test[i+1])
		s1 = append(s1, test[i]+test[i+1])
	}
	fmt.Println(s1)

	// 3 数字重复统计
	// 初始化随机数生成器
	// rand.Seed(time.Now().UnixNano())

	// 生成100个随机整数
	randomIntegers := make([]int, 100)
	for i := 0; i < 100; i++ {
		randomIntegers[i] = rand.Intn(201) - 100
	}

	// 打印随机整数
	// 降序排序
	sort.Sort(sort.Reverse(sort.IntSlice(randomIntegers)))

	// 打印随机整数和重复次数
	for _, num := range randomIntegers {
		fmt.Printf("%d (重复 %d 次)\n", num, countOccurrences(randomIntegers, num))
	}
}

func countOccurrences(arr []int, target int) int {
	count := 0
	for _, num := range arr {
		if num == target {
			count++
		}
	}
	return count

}

//4.简述线性数据结构和哈希表优劣
/*

线性表优劣：
可索引
顺序表：线性数据结构，易于实现和理解。支持顺序访问，适合实现顺序存储和处理
链表：动态数据结构，容易在任何位置插入或删除元素，不需要预先分配固定的存储空间
缺点：
固定大小：数组在定义时固定大小，扩展效率不高
插入和删除开销：在数组中插入或删除元素通常需要移动大量元素，导致效率低下。
空间利用（链表）：链表中每个节点需要额外的空间来存储指针，增加了内存的开销。


哈希表优劣：
优点：
快速访问：理想情况下，哈希表能提供接近常数时间的搜索、插入和删除操作性能，这是其最大的优势。
高效的空间利用率：相对于某些线性数据结构，哈希表可以高效的存储元素，特别是在元素数量和空间大小不匹配时。
kv对存储：支持基于kv对的数据存储，便于通过key快速查找

缺点：
哈希冲突：两个k映射到同一个位置（冲突）需要额外的处理，如链地址法或开放地址法等，这会降低哈希表的效率
顺序遍历困难：与线性数据结构相比，哈希表难以按照元素的插入或排序进行遍历



*/
